package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.model.dto.OrderInvoiceDTO;
import com.ssy.lingxi.order.model.vo.basic.request.OrderInvoiceVO;
import com.ssy.lingxi.order.model.vo.basic.response.OrderInvoiceDetailVO;

import java.util.List;
import java.util.Map;

/**
 * 订单发票相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-19
 */
public interface IBaseOrderInvoiceService {
    /**
     * 校验并生成订单发票，调用方需要保存OrderDO
     * @param order 订单
     * @param hasInvoice 是否有发票
     * @param invoiceVO 订单发票接口参数
     * @param isCreate 是否新增，true-新增，false-修改
     * @return 校验结果
     */
    Wrapper<Void> checkOrderInvoice(OrderDO order, Boolean hasInvoice, OrderInvoiceVO invoiceVO, boolean isCreate);

    /**
     * 校验并生成订单发票，调用方需要保存OrderDO
     * @param order 订单
     * @param invoiceVO 订单发票接口参数
     * @param isCreate 是否新增，true-新增，false-修改
     * @return 校验结果
     */
    Wrapper<Void> checkOrderInvoice(OrderDO order, OrderInvoiceVO invoiceVO, boolean isCreate);

    /**
     * （转单） - 交易并生成订单发票，调用方需要保存OrderDO
     * @param order 转单后的订单
     * @param invoiceDTO 上游供应商发票
     * @return 操作结果
     */
    Wrapper<Void> transferOrderInvoice(OrderDO order, OrderInvoiceDTO invoiceDTO);

    /**
     * 查询订单发票信息
     * @param order 订单
     * @return 查询结果
     */
    OrderInvoiceDetailVO getOrderInvoice(OrderDO order);

    /**
     * （转单）校验、查询上游供应商发票信息
     * @param orders 订单列表
     * @return 查询结果
     */
    Wrapper<Map<Long, OrderInvoiceDTO>> findSupplyOrderInvoice(List<OrderDO> orders);
}
